package JVM.第03篇_运行时内存篇;

import org.junit.Test;

/**
 * ●Java堆区用于存储Java对象实例，那么堆的大小在JVM启动时就已经设定好了，大家可以
 * 通过选项”-Xmx” 和”-Xms” 来进行设置。
 *          ●“-Xms"用于表示堆区的起始内存，等价于-XX:InitialHeapSize
 *          ●“-Xmx”则用于表示堆区的最大内存，等价于-XX:MaxHeapSize
 * ●一旦堆区中的内存大小超过“-Xmx”所指定的最大内存时，将会抛出
 *      OutOfMemoryError :heap异常。
 * ●通常会将-Xms和-Xmx两个参数配置相同的值，其目的是为了能够在java垃圾回收机制
 * 清理完堆区后不需要重新分隔计算堆区的大小，从而提高性能。
 *
 * ●heap默认最大值计算方式:如果物理内存少于192M,那么heap最大值为物理内存的一半
 * 如果物理内存大于等于1G，那么heap的最大值为物理内存的1/4。
 * ●heap默认最小值计算方式:最少不得少于8M,如果物理内存大于等于1G，那么默认值为
 * 物理内存的1/64，即1024/64=16M。 最小堆内存在jvm启动的时候就会被初始化。
 */
public class E2_堆的内存设置 {
    @Test
    public void heap_xms_xmx(){
        //-Xms10m -Xmx10m -XX:+PrintGCDetails   //配置
        //在"生产上"  Xmx（最大内存）  Xms（初始值大小）  必须一样   避免内存忽高忽低产生停顿 产生莫名其妙的异常
        System.out.println(Runtime.getRuntime().availableProcessors());//看你几核处理器
        long maxMemory=Runtime.getRuntime().maxMemory();//返回Java虚拟机默认试图使用的最大内存   物理内存的1/4
        long totalMemory =Runtime.getRuntime().totalMemory();//返回Java虚拟机总容量           物理内存的1/64
        System.out.println("Xmx:"+maxMemory+"(字节)\t    "+(maxMemory)/(double)1024/1024+"MB");
        System.out.println("Xms:"+totalMemory+"(字节)\t    "+(totalMemory)/(double)1024/1024+"MB");
    }  // 虚拟机默认最大内存

}
